#/bin/bash
#rsync auto sync script with inotify

current_date=$(date +%Y%m%d)
source_path=/data/logs/${current_date}
log_file={{ log_file }}

#rsync
rsync_server={{ rsync_server }}
rsync_user={{ rsync_user }}
rsync_pwd={{ rsync_pwd }}
rsync_module={{ rsync_module }}
#INOTIFY_EXCLUDE='(.*/*\.log|.*/*\.swp)$|^/tmp/src/mail/(2014|20.*/.*che.*)'
INOTIFY_EXCLUDE='.*/*\.swp$'
RSYNC_EXCLUDE={{ rsync_path }}/rsync_exclude.lst
IPADDR=`ifconfig  |grep -v 127.0.0.1| awk -F'[ :]+' '/inet addr/{printf "-"$4}END{print}'`
#Mark="prod"
Host=$(hostname)


#rsync client pwd check
if [ ! -e ${rsync_pwd} ];then
    echo -e "rsync client passwod file ${rsync_pwd} does not exist!"
    exit 0
fi


#400 error
Error400 (){
echo "exit ,Plz check"
exit 400
}


#inotify_function
#inotify_fun(){
#    /usr/bin/inotifywait -mrq --timefmt '%Y/%m/%d-%H:%M:%S' --format '%T %w %f' \
#          --exclude ${INOTIFY_EXCLUDE}  -e modify,delete,create,move,attrib ${source_path} \
#          | while read file
#      do
#          /usr/bin/rsync -auvrtzopgP --exclude-from=${RSYNC_EXCLUDE} --progress --bwlimit=200 --password-file=${rsync_pwd}  ${source_path} ${rsync_user}@${rsync_server}::${rsync_module}/${Mark}${IPADDR}
#      done
#}

[ -d ${source_path} ] || mkdir ${source_path}

inotify_fun(){
    /usr/bin/inotifywait -mrq --timefmt '%Y/%m/%d-%H:%M:%S' --format '%Xe %T %w %f' --exclude ${INOTIFY_EXCLUDE} -e modify,delete,create,move,attrib,close_write ${source_path} | while read file
        do
	    INO_EVENT=$(echo $file | awk '{print $1}')      # 把inotify输出切割 把事件类型部分赋值给INO_EVENT
	    INO_DIR=$(echo $file | awk '{print $3}')       # 把inotify输出切割 把文件路径部分赋值给INO_DIR
	    echo "----------------------$(date)-------------------"
	    echo $file
	    #增加、修改、写入完成、移动进事件
	    #增、改放在同一个判断，因为他们都肯定是针对文件的操作，即使是新建目录，要同步的也只是一个空目录，不会影响速度
	    if [[ $INO_EVENT =~ 'CREATE' ]] || [[ $INO_EVENT =~ 'MODIFY' ]] || [[ $INO_EVENT =~ 'CLOSE_WRITE' ]] || [[ $INO_EVENT =~ 'MOVED_TO' ]]         # 判断事件类型
	    then
		echo 'CREATE or MODIFY or CLOSE_WRITE or MOVED_TO'
		/usr/bin/rsync -auvrtzopgP --exclude-from=${RSYNC_EXCLUDE} --progress --bwlimit=60000 --password-file=${rsync_pwd} ${INO_DIR} ${rsync_user}@${rsync_server}::${rsync_module}/${Host}-${current_date}
		#仔细看 上面的rsync同步命令 源是用了$(dirname ${INO_DIR})变量 即每次只针对性的同步发生改变的文件的目录(只同步目标文件的方法在生产环境的某些极端环境下会漏文件 现在可以在不漏文件下也有不错的速度 做到平衡)
	    fi
	    #删除、移动出事件
	    if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]]
	    then
		echo 'DELETE or MOVED_FROM'
		/usr/bin/rsync -auvrtzopgP --exclude-from=${RSYNC_EXCLUDE} --progress --bwlimit=60000 --password-file=${rsync_pwd} ${INO_DIR} ${rsync_user}@${rsync_server}::${rsync_module}/${Host}-${current_date}
		#看rsync命令 如果直接同步已删除的路径${INO_DIR}会报no such or directory错误 所以这里同步的源是被删文件或目录的上一级路径，并加上--delete来删除目标上有而源中没有的文件，这里不能做到指定文件删除，如果删除的路径越靠近根，则同步的目录月多，同步删除的操作就越花时间
	    fi
	    #修改属性事件 指 touch chgrp chmod chown等操作
	    if [[ $INO_EVENT =~ 'ATTRIB' ]]
	    then
		echo 'ATTRIB'
		if [ ! -d "$INO_DIR" ]                 # 如果修改属性的是目录 则不同步，因为同步目录会发生递归扫描，等此目录下的文件发生同步时，rsync会顺带更新此目录
		then
		    /usr/bin/rsync -auvrtzopgP --exclude-from=${RSYNC_EXCLUDE} --progress --bwlimit=60000 --password-file=${rsync_pwd} ${INO_DIR} ${rsync_user}@${rsync_server}::${rsync_module}/${Host}-${current_date}
		fi
	    fi
        done
}

#inotify log
[[ `pidof inotifywait` ]] && kill `pidof inotifywait` 
inotify_fun >> ${log_file} 2>&1 &
